GtkSearchEngine: Avoid crawling indexed locations
authorMatthias Clasen <mclasen@redhat.com>
Fri, 19 Jun 2015 04:11:01 +0000 (00:11 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 19 Jun 2015 04:11:01 +0000 (00:11 -0400)
Add a framework to the simple engine that allows to skip
locations which are indexed by the native engine.

gtk/gtksearchenginesimple.c
gtk/gtksearchenginesimple.h

index 769dd04dc2fa8053a2d87650e3d9ef75e10516b0..b405aef97621da57eb81493e2d8128f0826fc523 100644 (file)
@@ -54,6 +54,9 @@ struct _GtkSearchEngineSimplePrivate
   SearchThreadData *active_search;
 
   gboolean query_finished;
+
+  GtkSearchEngineSimpleIsIndexed is_indexed_callback;
+  gpointer                       is_indexed_data;
 };
 
 
@@ -179,6 +182,25 @@ send_batch (SearchThreadData *data)
   data->hits = NULL;
 }
 
+static gboolean
+is_indexed (GtkSearchEngineSimple *engine,
+            GFile                 *location)
+{
+  if (engine->priv->is_indexed_callback)
+    {
+      if (engine->priv->is_indexed_callback (location, engine->priv->is_indexed_data))
+        {
+          gchar *uri = g_file_get_uri (location);
+          g_debug ("Simple search engine: Skipping indexed location: %s\n", uri);
+          g_free (uri);
+
+          return TRUE;
+        }
+    }
+
+  return FALSE;
+}
+
 static void
 visit_directory (GFile *dir, SearchThreadData *data)
 {
@@ -227,7 +249,9 @@ visit_directory (GFile *dir, SearchThreadData *data)
       if (data->n_processed_files > BATCH_SIZE)
         send_batch (data);
 
-      if (data->recursive && g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY)
+      if (data->recursive &&
+          g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY &&
+          !is_indexed (data->engine, child))
         g_queue_push_tail (data->directories, g_object_ref (child));
     }
 
@@ -337,3 +361,12 @@ _gtk_search_engine_simple_new (void)
 {
   return g_object_new (GTK_TYPE_SEARCH_ENGINE_SIMPLE, NULL);
 }
+
+void
+_gtk_search_engine_simple_set_indexed_cb (GtkSearchEngineSimple          *engine,
+                                          GtkSearchEngineSimpleIsIndexed  callback,
+                                          gpointer                        data)
+{
+  engine->priv->is_indexed_callback = callback;
+  engine->priv->is_indexed_data = data;
+}
index b03366f58fe19b215a06c5fef870ff53e75b3f86..83a60b18749e12ec85f3aac29464b9b9758f6731 100644 (file)
@@ -53,6 +53,12 @@ GType            _gtk_search_engine_simple_get_type (void);
 
 GtkSearchEngine* _gtk_search_engine_simple_new      (void);
 
+typedef gboolean (*GtkSearchEngineSimpleIsIndexed) (GFile *location, gpointer data);
+
+void             _gtk_search_engine_simple_set_indexed_cb (GtkSearchEngineSimple *engine,
+                                                           GtkSearchEngineSimpleIsIndexed callback,
+                                                           gpointer                       data);
+
 G_END_DECLS
 
 #endif /* __GTK_SEARCH_ENGINE_SIMPLE_H__ */